package com.sky.aspect;

import com.sky.annotation.AutoFIll;
import com.sky.constant.AutoFillConstant;
import com.sky.context.BaseContext;
import com.sky.enumeration.OperationType;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.time.LocalDateTime;

// 定义切面类
@Component
@Aspect
public class AutoFillAspect {

    // 前置通知 处理公共字段自动填充
    @Before("@annotation(com.sky.annotation.AutoFIll)")
    public void autoFill(JoinPoint joinPoint) throws Exception {
        // 通过连接点 获取到方法签名  根据方法签名获取方法对象
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();

        //String methodName = signature.getName();

        // 通过连接点获取到方法参数
        Object[] args = joinPoint.getArgs();
        Object entity = null;
        if (args != null || args.length > 0) {
            entity = args[0];
        }

        // 判断方法的操作类型
        AutoFIll annotation = method.getAnnotation(AutoFIll.class);
        OperationType value = annotation.value();
        if (value.equals(OperationType.INSERT)) {
            // 如果是新增 赋值
            // 反射第一步: 获取字节码对象 根据字节码对象获取到方法对象，再调用方法对象赋值  (也可以获取成员变量进行赋值)
            entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class).invoke(entity, LocalDateTime.now());
            entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class).invoke(entity, LocalDateTime.now());
            entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class).invoke(entity, BaseContext.getCurrentId());
            entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class).invoke(entity, BaseContext.getCurrentId());
        } else if (value.equals(OperationType.UPDATE)) {
            // 修改
            entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class).invoke(entity, LocalDateTime.now());
            entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class).invoke(entity, BaseContext.getCurrentId());
        }


    }

}
